package com.it.collection_test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Room {
    // 必须有一副牌
    private List<Card> allCards = new ArrayList<>();

    public Room() {
        // 1.做出54张牌，存入到集合allCards
        // a、点数：个数确定了,类型确定
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};

        // b、花色：个数确定了，类型确定
        String[] colors = {"♠", "♥", "♣", "♦"};

        int size = 0; // 表示每张牌的大小

        // c、遍历点数,再遍历花色,组织牌
        for (String number : numbers) {
            // number = "3"
            size++; // 1 2...
            for (String color : colors) {
                // 得到一张牌
                Card c = new Card(number, color, size);
                allCards.add(c); // 存入了牌
            } // 此时存入了52张牌
        }

        // 单独存入小王,大王
        Card c1 = new Card("", "🃏", ++size); //小王
        Card c2 = new Card("", "👲", ++size); //大王
        Collections.addAll(allCards, c1, c2);

        System.out.println("新牌：" + allCards);
    }

    /**
     * 游戏启动
     */
    public void start() {
        // 1.洗牌： allCards
        Collections.shuffle(allCards);
        System.out.println("洗牌后：" + allCards);

        // 2.发牌，首先肯定要定义 三个玩家  List(ArrayList: 支持排序，可重复，有索引)
        List<Card> linHuChong = new ArrayList<>();
        List<Card> jiuMozhi = new ArrayList<>();
        List<Card> renYingYing = new ArrayList<>();
        // 正式发牌给这三个玩家，依次发出51张牌，剩余3张做底牌
        // allCards =[♣8, ♦Q, ♦8, ♠K, ♠Q, ♣2, ♠3, ♥8,...]
        //            0    1   2   3   4   5   6   7...  %3

        for (int i = 0; i < allCards.size() - 3; i++) {
            Card c = allCards.get(i);
            // 判断牌发给谁
            if (i % 3 == 0) {
                // 请令狐冲接牌
                linHuChong.add(c);
            } else if (i % 3 == 1) {
                // 请鸠摩志接牌
                jiuMozhi.add(c);
            } else if (i % 3 == 2) {
                // 请任盈盈接牌
                renYingYing.add(c);
            }
        }

        // 3、对3个玩家的牌进行排序
        sortCards(linHuChong);
        sortCards(jiuMozhi);
        sortCards(renYingYing);

        // 4、看牌
        System.out.println("令狐冲:" + linHuChong);
        System.out.println("鸠摩智:" + jiuMozhi);
        System.out.println("任盈盈:" + renYingYing);

        // subList() => sublist函数是Java中List接口中的一个方法，用于截取原List中指定区间的元素，返回一个新的List，其中包含原List中指定区间的所有元素。该函数的指定区间范围是左闭右开的区间。
        // 最后三张底牌
        List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size()); // 51 52 53
        System.out.println("底牌：" + lastThreeCards);
        jiuMozhi.addAll(lastThreeCards);
        sortCards(jiuMozhi);
        System.out.println("鸠摩智抢到地主后：" + jiuMozhi);
    }

    /**
     * 集中进行排序
     *
     * @param cards
     */
    private void sortCards(List<Card> cards) {
        Collections.sort(cards, new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
//                return o1.getSize() - o2.getSize(); // 升序
                return o2.getSize() - o1.getSize(); // 降序
            }
        });
    }
}
